﻿// stdafx.h: 标准系统包含文件的包含文件，
// 或是经常使用但不常更改的
// 项目特定的包含文件
//

#pragma once

#include "../MyUtils/StringUtils.h"
#include "../MyUtils/ISingleton.h"

#include <map>

typedef unsigned int UInt;
typedef unsigned int ULong;

class TrainTicketInfo
{
public:
	ULong ticketNumber;

	std::TString dataTime;
	std::TString trainNumber;
	std::TString destination;
	float price;
	ULong minutes;
};
typedef std::map<ULong, TrainTicketInfo> TrainTicketInfoMap;

// 接口
class ITrainTicketModule
{
public:
	ITrainTicketModule() {}
	virtual ~ITrainTicketModule() {}

public:
	// 此信号通知窗口表格增加一行信息
	sigslot::Signal<const TrainTicketInfo&> signal_onAddTicket;

	virtual void RecvTicket(const TrainTicketInfo& ticket) = 0;
	virtual bool BuyTicket(ULONG ticketNo) = 0;

	virtual const TrainTicketInfo* GetTicketInfo(ULONG ticketNo) = 0;
};

// 处理票务系统的逻辑模块
// 此模块不依赖窗口类，通过信号通知窗口更新数据
// 窗口类依赖此模块，通过此类的接口访问数据
// 为了使用方便，此类可以设计为单件类（非必须）
// 如果此类提供槽函数，则必须继承自DuiLib::SignalSlotBase
// 只提供信号则没必要继承
class TrainTicketModule : public ITrainTicketModule
						// public Utils::ISingleton<TrainTicketModule>
						// public DuiLib::SignalSlotBase, 
{
public:
	TrainTicketModule();
	~TrainTicketModule();

	void RecvTicket(const TrainTicketInfo& ticket);
	bool BuyTicket(ULONG ticketNo);

	const TrainTicketInfo* GetTicketInfo(ULONG ticketNo);

private:
	TrainTicketInfoMap m_TrainTickes;


	static DWORD WINAPI __TestRecvTicket(LPVOID param);
	static ITrainTicketModule* m_pInstance;
	static CRITICAL_SECTION m_CriticalSection;
};